import axios from 'axios';
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';

// 可以根据您的 API 响应结构定义此类型
interface ApiResponse<T = any> { 
  code: number;
  message: string;
  data: T;
}

class AxiosClient {
  private instance: AxiosInstance;

  constructor(config: AxiosRequestConfig) {
    this.instance = axios.create(config);
    this.setupInterceptors();
  }

  private setupInterceptors(): void {
    // 请求拦截器
    this.instance.interceptors.request.use(
      (config: InternalAxiosRequestConfig) => {
        // 在发送请求之前做些什么，例如添加认证令牌
        const token = localStorage.getItem('token');
        if (token) {
          config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
      },
      (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
      }
    );

    // 响应拦截器
    this.instance.interceptors.response.use(
      (response: AxiosResponse<ApiResponse>) => {
        // 对响应数据做点什么
        const { data } = response;
        // 假设 code 为 0 是成功的标志
        if (data.code === 200) {
          return data.data;
        } else {
          // 处理业务错误，例如显示一个通知
          console.error('API Error:', data.message);
          return Promise.reject(new Error(data.message || 'Error'));
        }
      },
      (error) => {
        // 处理 HTTP 错误
        if (error.response) {
          // 请求已发出，但服务器响应的状态码不在 2xx 范围内
          console.error('Response Error:', error.response.status, error.response.data);
        } else if (error.request) {
          // 请求已发出，但没有收到响应
          console.error('Request Error:', error.request);
        } else {
          // 在设置请求时触发了一个错误
          console.error('Error', error.message);
        }
        return Promise.reject(error);
      }
    );
  }

  public get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.get<ApiResponse<T>>(url, config).then(res => res as unknown as T);
  }

  public post<T>(url:string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.post<ApiResponse<T>>(url, data, config).then(res => res as unknown as T);
  }

  public put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.put<ApiResponse<T>>(url, data, config).then(res => res as unknown as T);
  }

  public delete<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return this.instance.delete<ApiResponse<T>>(url, config).then(res => res as unknown as T);
  }
}

// 创建并导出一个 Axios 客户端实例
const apiClient = new AxiosClient({
  baseURL: "http://localhost:8080", // 替换为您的 API 基础 URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
  },
});

export default apiClient;